package wenjianliu;


import java.io.*;
import java.util.UUID;

public class test01 {
    public static void main(String[] args) throws IOException {
       // testFile2("D:\\shangchuan.txt");
       // testFile3("D:\\shangchuan.txt");
        //testFile4("D:\\dalei");
        //testFile5("D:\\dalei","D:\\DALEI666");
        //testPrintStream();
        //testFileWriter();
        testBufferedReader("D:\\zifu.txt");
    }


    /**
     * 通过	文件流	实现文件上传 D:\shangchuan.txt	60491
     * 思路:
     * 	1.通过file与上传文件的路径建立联系
     * 	2.和上传文件的路径建立联系,如果不存在则创建文件夹
     * 	3.读文件和写文件
     * 	4.关闭流
     *
     */
        public static void testFile2(String src){
            //创建file对象 与源文件建立联系
            File file = new File(src);
            //创建上传目标路径 ，如果不存在就创建
            String path = "D:\\dalei\\";
            //创建file对象 让目标文件路径由此建立联系
            File uploadFile = new File(path);
            //判断是否存在该文件
            if(!uploadFile.exists()){
                //一层文件夹的创建 如果多层的话 使用mkdirs方法进行创建
                uploadFile.mkdir();
            }
            //判断源文件 是否 存在
            if(file.exists()){
                InputStream is = null;
                OutputStream os = null;
                try {
                    //创建输入和输出流
                     is = new FileInputStream(file);
                     // D:\dalei\  1654217650361 shangchuan.txt
                    String timePath = path+System.currentTimeMillis()+file.getName();
                     os = new FileOutputStream(timePath);
                    //创建byte数组 提高读写效率
                    byte[]bytes = new byte[1024];
                    int len = 0; //每次读的长度
                    while((len=is.read(bytes))!=-1  ){
                        os.write(bytes,0,len);
                    }
                    System.out.println("复制成功"+timePath);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        //关闭资源
                        os.close();
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            }

        }


    /**
     *通过缓冲流 实现文件上传
     */
    public static  void testFile3(String src) throws IOException {
        //创建file对象 使其与源文件路径产生联系
        File file = new File(src);
        //创建上传目标路径
        String path = "D:\\dalei3\\";
        //创建file对象 与目标文件路径产生联系
        File file3 = new File(path);
        //判断目标路径是否为空 为空则创建
        if(!file3.exists()){
            file3.mkdir();  //单层创建
        }
        //判断源文件是不是为空
        if(file.exists()){
            //创建缓存输入输出流
            InputStream is = new BufferedInputStream(new FileInputStream(file));
            //需要上传的目标路径的 txt文件
            String uppath = path+System.currentTimeMillis()+file.getName();
            OutputStream os = new BufferedOutputStream(new FileOutputStream(uppath));
            //创建byte数组 增减读写效率
            byte[] b = new byte[1024];
            int len=0; //每次读取的长度
            while ( (len=is.read(b))!=-1  ){
                os.write(b,0,len);
            }
            System.out.println("成功");
            //关闭流
            os.close();
            is.close();
        }
    }

    /**
     * 文件流 多文件上传 都是 .txt
     */
    public static void testFile4(String src) throws IOException {
        //创建file对象 与 源文件进行关联
        File file = new File(src);
        //声明目标文件路径
        String path = "D:\\DaLei\\";
        //创建file对象 与 目标对象进行关联
        File file4 = new File(path);
        //判断目标文件是不是空的 空则创建一个
        if(!file4.exists()){
            file4.mkdir();  //单层创建   多层用dirs()
        }
        //判断源文件是否存在
        if(file.exists()){
            //获取源文件下的所有文件和文件夹
            File[] files = file.listFiles();
            //遍历
            for (File f:files) {
                //判断是不是文件
                if(f.isFile()){
                    //创建输出输入流
                    InputStream is = new FileInputStream(f);
                    //目标文件路径
                    String mbpath = path+f.getName();
                    OutputStream os = new FileOutputStream(mbpath);
                    //创建byte数组 增加读写效率
                    byte[] bytes = new byte[1024];
                    int len = 0; //每次读取到数据的长度
                    while ( (len=is.read(bytes))!=-1 ){
                        os.write(bytes,0,len);
                    }
                    //关闭流
                    os.close();
                    is.close();
                }
                if(f.isDirectory()){
                    //是文件夹 然后递归调用
                    testFile4(f.getAbsolutePath());
                }

            }
            System.out.println("成功");

        }

    }

    /**
     *把一个文件夹内容 复制到另外一个文件中中
     */
    public static void testFile5(String copy,String paste) throws IOException {
        //创建file对象 与 源文件进行关联
        File file = new File(copy);
        //创建file对象 与 目标文件进行关联
        File file2 = new File(paste);
        //判断目标文件是不是文件  如果不是 就结束
        if(!file2.isDirectory()){
            return;
        }
        //判断源文件是否存在
        if(file.exists()){
            //获取源文件的listfiles
            File[] files = file.listFiles();
            //遍历
            for (File f:files) {
                //需要复制的文件的路径
                String outFile = copy+File.separator+f.getName();
                //黏贴的文件路径
                String toFile = paste+File.separator+f.getName();
                //判断是不是文件
                if(f.isDirectory()){
                    //进行递归
                    System.out.println("我是文件夹 进行递归"+outFile);
                    File file6 = new File(outFile);
                    if(!file6.exists()){
                        file6.mkdir();
                    }

                    testFile5(outFile,toFile);
                }
                if(f.isFile()){
                    System.out.println("正在复制......");
                    copy(outFile,toFile);
                    System.out.println("复制成功");
                }
            }

        }else{
            System.out.println("源文件不存在");
        }
    }
    //复制文件的方法
    public static void copy(String copy,String paste) throws IOException {
        //创建输入流和输出流
        InputStream is = new FileInputStream(copy);
        OutputStream os = new FileOutputStream(paste);
        //创建byte数组 增加读写效率
        byte[]bytes=new byte[1024];
        int len = 0 ; //每次读的数据的长度
        while((len=is.read(bytes))!=-1 ){
            os.write(bytes,0,len);
        }
        //关闭流
        os.close();
        is.close();
    }



    //打印流
    public static void testPrintStream() throws FileNotFoundException, UnsupportedEncodingException {
        PrintStream ps = new PrintStream("AAA.txt","UTF-8");
        ps.append("测试打印流"); //追加
        ps.println("打印流");
        ps.append("你好 打印流");
        ps.close();
    }
    //文件打印流
    private static void testFileWriter() throws IOException {
        //第二个参数如果是true,在文本后面追加,false文本内容清空,重头开始录入
        FileWriter fw = new FileWriter("ccc.txt",true);
        fw.write("3333测试 fileWriter...");
        fw.write("4444测试 fileWriter...\n");
        fw.write("4444测试 fileWriter...");
        fw.close();
    }


    //字符流
    public static void testBufferedReader(String src) throws IOException {
        //创建缓存字符输入输出流
        File file = new File(src);
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String path ="D:\\zifuliu.txt";
        File file3 = new File(path);
        BufferedWriter writer = new BufferedWriter(new FileWriter(file3));
        //判断目标文件是否存在
        if(!file3.exists()){
            file3.mkdir();
        }
        if(file.exists()){
            //读取文本有二种方式

            //1 按字符读
            //创建char字符数组 增加读写效率
//            char[]chars = new char[200];
//            int len = 0 ; //每次读取的数据的长度
//            while((len=reader.read())!=-1 ){
//                writer.write(chars,0,len);
//            }
//            System.out.println("成功");
//            //关闭流
//            writer.close();
//            reader.close();

            //第二种
            String line; //读取的每一行
            boolean flag=false;
            while( (line = reader.readLine())!=null ){
                writer.write(line);
                flag=true;
               writer.newLine();
            }
            if(flag){
                System.out.println("成功");
            }

            //关闭流
            writer.close();
            reader.close();
        }
    }

}



